﻿// See https://aka.ms/new-console-template for more information
using System;
using System.Collections;
using System.Diagnostics;
using System.Reflection.Metadata.Ecma335;
//父类的实例构造器子类没有办法继承
//namespace shh
//{
//    class Program
//    {
//        static void Main(string[] args)
//        {
//            Type t = typeof(Car);
//            Type tb = t.BaseType;

//            Console.WriteLine(tb.FullName);
//        }
//    }

//    class Vehicle
//    {
//        public string Name
//        {
//            get { return Name; }
//            set { Name = value; }
//        }
//        public virtual void Run()
//        {
//            Console.WriteLine("I'm Vehicle");
//        }
//    }
//    class Car:Vehicle
//    {
//        public override void Run()
//        {
//            Console.WriteLine("I'm Car");
//        }
//    }
//    class RaceCar : Car
//    {
//        public override void Run()
//        {
//            Console.WriteLine("I'm RaceCar");
//        }
//    }
//}






//具体类->抽象类->接口
//namespace shh
//{
//    class Program
//    {
//        static void Main(string[] args)
//        {
//            Vehicle vehicle = new Truck();
//            vehicle.Run();
//        }
//    }

//接口是完全未实现逻辑的类,纯虚类,只有函数成员,且都为public
////abstract class VehicleBase
////{
////    abstract public void Stop();
////    abstract public void Run();
////}
//interface IVehicleBase
//{
//    void Stop();
//    void Run();
//}
//abstract class Vehicle: IVehicleBase
//{
//    public void Stop()  //实现接口不需要写override
//    {
//        Console.WriteLine("Stop...");
//    }
//    abstract public void Run();
//}
//class Car : Vehicle
//{
//    override public void Run()
//    {
//        Console.WriteLine("car is running...");
//    }
//}
//class Truck : Vehicle
//{
//    override public void Run()
//    {
//        Console.WriteLine("truck is running...");
//    }
//}

//abstract 抽象类 :为复用而生,不能实例化,专门作为基类,未完全实现逻辑的类(方法没实现)
//abstract class Vehicle
//{
//    public void Stop()
//    {
//        Console.WriteLine("Stop...");
//    }
//    abstract public void Run();
//}
//class Car : Vehicle
//{
//    override public void Run()
//    {
//        Console.WriteLine("car is running...");
//    }
//}
//class Truck : Vehicle
//{
//    override public void Run()
//    {
//        Console.WriteLine("truck is running...");
//    }
//}

//多态的玩法,但如果Vehicle的Run函数一直没用到呢?多写代码只会增加测试维护的负担
//class Vehicle
//{
//    public void Stop()
//    {
//        Console.WriteLine("Stop...");
//    }
//    virtual public void Run()
//    {
//        Console.WriteLine("car is running...");
//    }
//}
//class Car : Vehicle
//{
//    override public void Run()
//    {
//        Console.WriteLine("car is running...");
//    }
//}
//class Truck : Vehicle
//{
//    override public void Run()
//    {
//        Console.WriteLine("truck is running...");
//    }
//}

//继承能解决问题,怎么实现多态呢?
//class Vehicle
//{
//    public void Stop()
//    {
//        Console.WriteLine("Stop...");
//    }
//}
//class Car: Vehicle
//{
//    public void Run()
//    {
//        Console.WriteLine("car is running...");
//    }
//}
//class Truck: Vehicle
//{
//    public void Run()
//    {
//        Console.WriteLine("truck is running...");
//    }
//}

//两段代码重复,存在冗余
//class Car 
//{
//    public void Run()
//    {
//        Console.WriteLine("car is running...");
//    }
//    public void Stop()
//    {
//        Console.WriteLine("Stop...");
//    }
//}
//class Truck
//{
//    public void Run()
//    {
//        Console.WriteLine("truck is running...");
//    }
//    public void Stop()
//    {
//        Console.WriteLine("Stop...");
//    }
//}

//}

//namespace shh
//{
//    class Program
//    {
//        static void Main(string[] args)
//        {

//        }
//    }
//    class Engine
//    {
//        public int Rpm {  get; private set; }
//        public void 
//    }

//    class Car : Engine
//    {
//        public Engine _engine { get; set; }
//        public Car(Engine engine)
//        {
//            _engine = engine;

//            speed = 
//        }
//        public int speed { get; set; }
//    }
//}